#pragma once
#include<bits/stdc++.h>
using namespace std;

namespace m_std{
    template <size_t N>
    class bit_map{
    public:
        bit_map(){
            _map.resize(N / 8 + 1, 0);
        }
        void set(size_t n){
            size_t i = n / 8;
            size_t j = n % 8;
            _map[i] |= (1 << j);
        }
        void reset(size_t n){
            size_t i = n / 8;
            size_t j = n % 8;
            _map[i] &= ~(1 << j);
        }
        bool test(size_t n){
            size_t i = n / 8;
            size_t j = n % 8;
            return _map[i] & (1 << j);
        }
    private:
        vector<char> _map;
    };
    template<size_t N>
    class twoBitMap{
        public:
            void set(size_t n){
                bool map1 = _map1.test(n);
                bool map2 = _map2.test(n);
                if(map1 == false && map2 == false){
                    _map2.set(n);
                }else if(map1 == false && map2 == true){
                    _map1.set(n);
                    _map2.reset(n);
                }
            }
            void reset(size_t n){
                _map1.reset(n);
                _map2.reset(n);
            }
            bool test(size_t n){
                //返回只存在一个的数字
                return !_map1.test(n) && _map2.test(n);
            }
        private:
            bit_map<N> _map1;
            bit_map<N> _map2;
    };
};
